﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Infragistics.Win.UltraWinGrid;
using Infragistics.Win;

namespace RDD
{
    public partial class RegiImpo : Form
    {
        private estadoPantalla _Estado = estadoPantalla.Consultar;
        public estadoPantalla Estado
        {
            get { return _Estado; }
            set
            {
                _Estado = value;
                switch (value)
                {
                    case estadoPantalla.Consultar:
                        #region Estado Consultar
                        deshabilitarControles();
                        lblEstado.Text = "Estado Pantalla : Consulta";
                        break;
                        #endregion
                    case estadoPantalla.Editar:
                        #region Estado Editar
                        habilitarControles();
                        lblEstado.Text = "Estado Pantalla : Editando";
                        txtFecha.Focus();
                        break;
                        #endregion
                    case estadoPantalla.Insertar:
                        #region Estado Insertar
                        habilitarControles();
                        //picAuditoria.Enabled = false;
                        lblEstado.Text = "Estado Pantalla : Insertando";
                        txtNumeroImpo.Focus();
                        break;
                        #endregion
                }
            }
        }

        //Declarar variables de la forma
        private DataSet dsGridDatos = new DataSet();
        Importacion mImpor = new Importacion();
        bool mListoGridI = false;
        private bool datosValidos = true;
        bool tEncontroNodo = false;
        UltraGridRow mFila;
        string tFiltroEstadoActual;

        #region Metodos publicos
        public void buscarImportacion()
        {
            foreach (TreeNode tNodo in trvImpo.Nodes)
            {
                //Buscar importacion por valor
                tEncontroNodo = false;
                trvImpo.SelectedNode = tNodo.Nodes[txtBuscar.Text];
                if (trvImpo.SelectedNode != null)
                {
                    tEncontroNodo = true;
                    break;
                }
            }
            if (!tEncontroNodo)
            {
                MessageBox.Show("No se encontró el número de Importación : " + txtBuscar.Text, "RDD - Polizas de Importación");
            }
        }
        public RegiImpo()
        {
            InitializeComponent();
        }
        public void refrescar()
        {
            //Llena el arbol con los parametros actuales
            mListoGridI = false;
            //Mostrar todas
            if (ddlFiltroEstado.ComboBox.SelectedValue.ToString() != "T")
            { ddlFiltroEstado.ComboBox.SelectedValue = "T"; }
            else
            { llenarArbolImpo(); }
            this.Text = "Polizas de Importación - " + Valores.gCiaNom;
        }
        #endregion Metodos publicos

        private void RegiImpo_Load(object sender, EventArgs e)
        {
            this.trvImpo.ImageList = ((MDIPrincipal)this.ParentForm).imlImagenes;
            //Llenar listas
            llenarListasImpo();
            this.Text = "Polizas de Importación - " + Valores.gCiaNom;
        }
        #region Eventos 
        private void btnBorrar_Click(object sender, EventArgs e)
        {
            DialogResult mensaje = MessageBox.Show("Se va a borrar el registro de importacion # " + mImpor.ImportID + " ¿Esta seguro?", "Registro de Importación", MessageBoxButtons.YesNo, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button2);
            if (mensaje == DialogResult.Yes)
            {
                try
                {
                    mImpor.borrarRegistro();
                    trvImpo.SelectedNode.Remove();
                    trvImpo.SelectedNode = trvImpo.Nodes[trvImpo.Nodes.Count - 1].LastNode;
                    MessageBox.Show("El registro de importación fue borrado exitosamente.", "RDD - Borrar Importación", MessageBoxButtons.OK,MessageBoxIcon.Information);
                }
                catch (Exception ex)
                {
                    MessageBox.Show(Constantes.FALLA + ex.Message, Constantes.RDD, MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
        }        
        private void btnCancelar_Click(object sender, EventArgs e)
        {
            if (Estado == estadoPantalla.Insertar)
            {
                //Borrar nodo nuevo del arbol
                trvImpo.SelectedNode.Remove();
                Estado = estadoPantalla.Consultar;
                trvImpo.SelectedNode = trvImpo.Nodes[trvImpo.Nodes.Count - 1].LastNode;
            }
            else
            {
                //Cancelar edicion
                mostrarRegistroImpo();
            }
        }
        private void btnEditar_Click(object sender, EventArgs e)
        {
            //Habilitar los campos para edicion
            Estado = estadoPantalla.Editar;
        }
        private void btnFiltrar_Click(object sender, EventArgs e)
        {
            //Mostrar forma modal del filtro

        }
        private void btnInsertar_Click(object sender, EventArgs e)
        {
            limpiarControles();
            adicionarNodoNuevo();
            Estado = estadoPantalla.Insertar;
        }
        private void btnSalvar_Click(object sender, EventArgs e)
        {
            try
            {
                this.Cursor = Cursors.WaitCursor;
                //Validar datos de la maestra
                if (validarDatos())
                {
                    //Salvar los cambios en el grid, si hay
                    datosValidos = true;
                    grdDatos.UpdateData();
                    if (datosValidos)
                    {
                        asignarPropiedades();
                        mImpor.FechModi = DateTime.Now;
                        mImpor.UsuaModi = Valores.USUARIO;
                        DataTable dtGridDatos = dsGridDatos.Tables["DETIMP"];
                        if (Estado == estadoPantalla.Insertar)
                        {
                            if (mImpor.insertarRegistro(dtGridDatos))
                            {
                                //Volver a crear el arbol
                                txtBuscar.Text = txtNumeroImpo.Value.ToString();
                                this.Estado = estadoPantalla.Consultar;
                                llenarArbolImpo();
                                buscarImportacion();
                            }
                        }
                        else if (Estado == estadoPantalla.Editar)
                        {
                            mImpor.actualizarRegistro(dtGridDatos);
                            this.Estado = estadoPantalla.Consultar;
                        }
                        //Volver a estado Consulta
                        MessageBox.Show(Constantes.EXITOSO + " Cambios salvados. ", "Salvar Cambios", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Ocurrio un Error al salvar el registro." + ex.Message, "Registro de Importaciones", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            finally
            { this.Cursor = Cursors.Default; }
        }
        private void chkCardView_CheckedChanged(object sender, EventArgs e)
        {
            grdDatos.DisplayLayout.Bands["RelacionFacturas"].CardView = chkCardView.Checked;
        }
        private void cmdBuscar_Click(object sender, EventArgs e)
        {
            buscarImportacion();
        }
        private void cmdCancelar_Click(object sender, EventArgs e)
        {
            btnCancelar.PerformClick();
        }        
        private void cmdFiltroImpo_Click(object sender, EventArgs e)
        {
            buscarImportacion();
        }
        private void cmdVerRemision_Click(object sender, EventArgs e)
        {
            if (Estado == estadoPantalla.Consultar)
            {
                if (txtRemision.Text.Length > 0)
                {
                    //Mostrar Remision relacionada a la importación
                    MDIPrincipal tForma = ((MDIPrincipal)this.ParentForm);
                    //Verificar si ya está visible la forma
                    if (tForma.fRegiRemi == null || tForma.fRegiRemi.IsDisposed)
                    {
                        //Cargar en memoria la forma
                        tForma.fRegiRemi = new RegiRemi();
                        tForma.fRegiRemi.MdiParent = tForma;
                        tForma.fRegiRemi.Show();
                    }
                    //Buscar Factura en el arbol
                    tForma.fRegiRemi.txtBuscar.Text = txtRemision.Text.Trim();
                    tForma.fRegiRemi.buscarNodo();
                    tForma.fRegiRemi.WindowState = FormWindowState.Normal;
                    tForma.fRegiRemi.Focus();
                }
            }
        }

        private void ddlEstado_SelectionChanged(object sender, EventArgs e)
        {
            //Asignar al nodo el icono que le corresponde, de acuerdo al estado
            if (ddlEstado.Value != null && trvImpo.SelectedNode != null)
            {
                char tEstado = Convert.ToChar(ddlEstado.Value);
                int tImgIndex;
                switch (tEstado)
                {
                    case 'R':
                        tImgIndex = 5;
                        break;
                    case 'A':
                        tImgIndex = 3;
                        break;
                    case 'P':
                        tImgIndex = 7;
                        break;
                    case 'V':
                        tImgIndex = 9;
                        break;
                    case 'N':
                        tImgIndex = 11;
                        break;
                    default:
                        tImgIndex = 13;
                        break;
                }
                trvImpo.SelectedNode.ImageIndex = tImgIndex;
                trvImpo.SelectedNode.SelectedImageIndex = tImgIndex + 1;
            }
        }
        private void ddlFiltroEstado_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (ddlFiltroEstado.SelectedIndex >= 0 && ddlFiltroEstado.ComboBox.ValueMember.Length > 0)
            {
                if (ddlFiltroEstado.ComboBox.SelectedValue.ToString() != tFiltroEstadoActual)
                { llenarArbolImpo(); }
                ddlFiltroEstado.ComboBox.SelectedValue = tFiltroEstadoActual;
                return;
            }
        }
        private void mnuMarcarFilaBorrar_Click(object sender, EventArgs e)
        {
            if (!Convert.ToBoolean(mFila.Cells["INS"].Value))
            {
                mFila.Cells["BORRAR"].Value = !Convert.ToBoolean(mFila.Cells["BORRAR"].Value);
                if (Convert.ToBoolean(mFila.Cells["BORRAR"].Value))
                {
                    //Esta marcado para borrar, cambiar color
                    mFila.Appearance.BackColor = Color.LightCoral;
                }
                else
                {
                    mFila.Appearance.BackColor = Color.White;
                }
            }
            else
            {
                //No se puede borrar una fila nueva
                MessageBox.Show("No se puede marcar para borrar una fila nueva", "RDD - Importaciones", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }
        private void mnuRegiPago_Click(object sender, EventArgs e)
        {
            //Desplliega forma modal para capturar el pago
            RegiPago f = new RegiPago(mImpor, 'R');
            f.ShowDialog(this);
            mImpor.leerRegistro(Valores.gCiaCod, txtNumeroImpo.Value.ToString());
            mostrarRegistroImpo();
        }
        private void mnuBorrarPago_Click(object sender, EventArgs e)
        {
            //Desplliega forma modal para capturar el pago
            RegiPago f = new RegiPago(mImpor, 'B');
            f.ShowDialog(this);
            mImpor.leerRegistro(Valores.gCiaCod, txtNumeroImpo.Value.ToString());
            mostrarRegistroImpo();
        }
        private void Principal_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (Estado != estadoPantalla.Consultar)
            {
                DialogResult mensaje = MessageBox.Show("Los cambios no se han salvado. ¿Desea realmente salir?", "Registro de Importación", MessageBoxButtons.YesNo, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button2);
                if (mensaje == DialogResult.No)
                {
                    e.Cancel = true;
                }
            }
        }
        private void trvImpo_AfterSelect(object sender, TreeViewEventArgs e)
        {
            this.Cursor = Cursors.WaitCursor;
            try
            {
                if (e.Node.FullPath.Length > 4 && e.Node.Text != "Nueva")
                {
                    //Mostrar los valores de la importacion seleccionda
                    string tNumeImpo = trvImpo.SelectedNode.Text;
                    mImpor.leerRegistro(Valores.gCiaCod, tNumeImpo);
                    mostrarRegistroImpo();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "RDD - Polizas de Importación");
            }
            finally
            { this.Cursor = Cursors.Default; }
        }
        private void trvImpo_BeforeSelect(object sender, TreeViewCancelEventArgs e)
        {
            tEncontroNodo = true;
            if (Estado != estadoPantalla.Consultar && e.Node.FullPath.Length > 4)
            {
                DialogResult mensaje = MessageBox.Show("Los cambios no se han salvado. ¿Desea realmente salir?", "Registro de Importación", MessageBoxButtons.YesNo, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button2);
                if (mensaje == DialogResult.No)
                {
                    e.Cancel = true;
                }
                else if(Estado == estadoPantalla.Insertar)
                {
                    //Borrar el nodo acual
                    trvImpo.SelectedNode.Remove();
                }
            }
        }
        private void txtNumeroImpo_Enter(object sender, EventArgs e)
        {
            txtNumeroImpo.SelectAll();
        }
        private void txtFecha_Enter(object sender, EventArgs e)
        {
            txtFecha.SelectAll();
        }
        private void txtCalculo_Enter(object sender, EventArgs e)
        {
            txtCalculo.SelectAll();
        }
        private void txtValorImpo_Enter(object sender, EventArgs e)
        {
            txtValorImpo.SelectAll();
        }
        private void txtObservacion_Enter(object sender, EventArgs e)
        {
            txtObservacion.SelectAll();
        }
        private void txtFechRemi_Enter(object sender, EventArgs e)
        {
            txtFechRemi.SelectAll();
        }
        #endregion Eventos 

        #region Metodos Privados 
        private void adicionarNodoNuevo()
        {
            trvImpo.Nodes[trvImpo.Nodes.Count-1].Nodes.Add("Nueva", "Nueva", 7, 8);
            trvImpo.SelectedNode = trvImpo.Nodes[trvImpo.Nodes.Count - 1].LastNode;
        }
        private void asignarPropiedades()
        {
            mImpor.ImportID = Convert.ToInt32(txtNumeroImpo.Value);
            mImpor.Estado = Convert.ToChar(ddlEstado.Value);
            mImpor.Fecha = Convert.ToDateTime(txtFecha.Value);
            mImpor.Calculo = txtCalculo.Text;
            mImpor.ValorCol = Convert.ToDouble(txtValorImpo.Value);
            mImpor.RemisionID = txtRemision.Text;
            mImpor.AgenciaID = ddlAgencia.Value.ToString();
            mImpor.Observ = txtObservacion.Text;
            mImpor.FechAsig = Convert.ToDateTime(txtFechAsig.Value );

            mImpor.FechRemi =  Convert.ToDateTime(txtFechRemi.Value);
            mImpor.FechReem = Convert.ToDateTime(txtFechReem.Value);
            mImpor.ValorRemi = Convert.ToDouble(txtValorRemi.Value);
            mImpor.ValorReem= Convert.ToDouble(txtValorReem.Value);
            //Calcular total importacion
            mImpor.TotImp = 0;
            DataTable dtGridDatos = dsGridDatos.Tables["DETIMP"];
            foreach (DataRow tFila in dtGridDatos.Rows)
            {
                if (tFila.RowState != DataRowState.Deleted)
                {
                    mImpor.TotImp += Convert.ToDouble(tFila["CANTIMPORT"]);
                }
            }
            txtTotalImport.Value = mImpor.TotImp;
            if (Estado == estadoPantalla.Insertar)
            {
                txtTotalSaldo.Value = mImpor.TotImp;
            }

        }
        private void configurarGridI()
        {
            #region Banda 0
            //Dar formato al grid banda 0 - Periodo
            UltraGridBand banda0 = grdDatos.DisplayLayout.Bands["DETIMP"];
            banda0.Override.HeaderAppearance.TextHAlign = Infragistics.Win.HAlign.Center;
            //Ocultar campos llave foranea
            banda0.Columns["CIACOD"].Hidden = true;
            banda0.Columns["IMPORTID"].Hidden = true;
            banda0.Columns["IMPORTID"].Header.Caption = "Importacion";
            //Buscar los productos asociados a esta compañia
            Infragistics.Win.UltraWinGrid.UltraDropDown colCombo = new Infragistics.Win.UltraWinGrid.UltraDropDown();
            Articulo a = new Articulo();
            colCombo.DataSource = a.leerTodos(Valores.gCiaCod);
            colCombo.DisplayMember = "NOMBRE";
            colCombo.ValueMember = "REFERENCIA";
            colCombo.DisplayLayout.Bands[0].Columns["REFERENCIA"].Hidden = true;
            colCombo.DisplayLayout.Bands[0].Columns["NOMBRE"].Width = 180;
            //Configurar Celda ComboBox
            banda0.Columns["REFERENCIA"].Style = Infragistics.Win.UltraWinGrid.ColumnStyle.DropDownValidate;
            banda0.Columns["REFERENCIA"].Width = 180;
            banda0.Columns["REFERENCIA"].Header.Caption = "Referencia";
            banda0.Columns["REFERENCIA"].ValueList = colCombo;
            //Cantidad Importada
            banda0.Columns["CANTIMPORT"].Style = Infragistics.Win.UltraWinGrid.ColumnStyle.IntegerNonNegative;
            banda0.Columns["CANTIMPORT"].MaskInput = "nn,nnn,nnn";
            banda0.Columns["CANTIMPORT"].MaxValue = 899999;
            banda0.Columns["CANTIMPORT"].CellAppearance.TextHAlign = Infragistics.Win.HAlign.Right;
            banda0.Columns["CANTIMPORT"].Format = "###,##0";
            banda0.Columns["CANTIMPORT"].Header.Caption = "Importadas";
            //Cantidad Exportada
            banda0.Columns["CANTEXPORT"].Style = Infragistics.Win.UltraWinGrid.ColumnStyle.IntegerPositive;
            banda0.Columns["CANTEXPORT"].CellAppearance.TextHAlign = Infragistics.Win.HAlign.Right;
            banda0.Columns["CANTEXPORT"].Format = "###,##0";
            banda0.Columns["CANTEXPORT"].TabStop = false;
            banda0.Columns["CANTEXPORT"].Header.Caption = "Exportadas";
            //Saldo
            banda0.Columns["SALDO"].Style = Infragistics.Win.UltraWinGrid.ColumnStyle.IntegerPositive;
            banda0.Columns["SALDO"].CellAppearance.TextHAlign = Infragistics.Win.HAlign.Right;
            banda0.Columns["SALDO"].Format = "###,##0";
            banda0.Columns["SALDO"].TabStop = false;
            banda0.Columns["SALDO"].Header.Caption = "Saldo";
            //Borrar
            banda0.Columns["BORRAR"].Style = Infragistics.Win.UltraWinGrid.ColumnStyle.CheckBox;
            banda0.Columns["BORRAR"].DefaultCellValue = false;
            banda0.Columns["BORRAR"].Header.Caption = "Borrar";
            banda0.Columns["BORRAR"].Width = 70;
            //Ocultar indicadores de Actualizar e Insertar
            banda0.Columns["ACT"].Hidden = true;
            banda0.Columns["INS"].Hidden = true;
            #endregion Banda 0

            #region banda 2 - Facturas del detalle de importacion
            //Configurar banda de facturas de exportacion
            UltraGridBand banda2 = grdDatos.DisplayLayout.Bands["RelacionFacturas"];
            banda2.CardSettings.ShowCaption = false;
            banda2.Override.HeaderAppearance.BackColor = Color.LightBlue;
            //Cambiar la alineacion de los encabezados en todo el grid
            banda2.Columns["CiaCod"].Hidden = true;
            banda2.Columns["ImportID"].Hidden = true;
            banda2.Columns["ArticuloID"].Hidden = true;
            //Factura
            banda2.Columns["FacturaID"].Header.Caption = "FacturaID";
            //Estado
            banda2.Columns["Estado"].Width = 35;
            banda2.Columns["Estado"].Header.Caption = "Estado";
            banda2.Columns["Estado"].CellAppearance.TextHAlign = Infragistics.Win.HAlign.Center;
            //Fecha
            banda2.Columns["Fecha"].Width = 60;
            banda2.Columns["Fecha"].CellAppearance.TextHAlign = Infragistics.Win.HAlign.Right;
            banda2.Columns["Fecha"].Header.Caption = "Fecha";
            //Estado
            //banda2.Columns["Estado"].Width = 100;
            banda2.Columns["ExportID"].CellAppearance.TextHAlign = Infragistics.Win.HAlign.Right;
            banda2.Columns["ExportID"].Header.Caption = "Poliza Expo";

            //Cantidad
            banda2.Columns["Cantidad"].Width = 80;
            banda2.Columns["Cantidad"].CellAppearance.TextHAlign = Infragistics.Win.HAlign.Right;
            banda2.Columns["Cantidad"].Format = "#,##0";
            banda2.Columns["Cantidad"].Header.Caption = "Cantidad";

            #endregion

            mListoGridI = true;
        }
        private void deshabilitarControles()
        {
            //No permitir modificar el contenido de los controles
            txtNumeroImpo.Enabled = false;
            txtFecha.Enabled = false;
            txtCalculo.Enabled = false;
            ddlAgencia.Enabled = false;
            txtValorImpo.Enabled = false;
            txtObservacion.Enabled = false;
            //No puede insertar filas o modificar los valores del grid
            grdDatos.DisplayLayout.Override.AllowAddNew = AllowAddNew.No;
            grdDatos.DisplayLayout.Override.AllowUpdate = Infragistics.Win.DefaultableBoolean.False;
            grdDatos.DisplayLayout.Bands["DetImp"].Columns["Borrar"].Hidden = true;
            //En caso de estar visible una nueva fila sin datos, se elimina
            grdDatos.PerformAction(UltraGridAction.UndoRow);
            btnEditar.Enabled = true;
            btnSalvar.Enabled = false;
            btnBorrar.Enabled = (txtTotalExport.Value.ToString() == "0");
            ddlFiltroEstado.Enabled = true;
            btnInsertar.Enabled = true;
            btnCancelar.Enabled = false;
            cmdFiltroImpo.Enabled = true;
            mnuPago.Enabled = true;
            mnuRegiPago.Enabled = (ddlEstado.Value.ToString() == "R");
            mnuBorrarPago.Enabled = (ddlEstado.Value.ToString() == "G");
        }
        private void habilitarControles()
        {
            //Permite modificar el contenido de los controles
            if (Estado == estadoPantalla.Insertar)
            {
                txtNumeroImpo.Enabled = true;
            }
            //Si No esta remitido se pueden modificar algunos valores, excepto el reembolso
            if (ddlEstado.Value.ToString() == "P")
            {
                txtFecha.Enabled = true;
                txtCalculo.Enabled = true;
            }
            ddlAgencia.Enabled = true;
            txtObservacion.Enabled = true;
            //Permitir editar las columnas del grid modificables, si no hay facturas de exportacion asociadas
            if (txtTotalExport.Value.ToString() == "0" || grdDatos.Rows.Count == 0)
            {
                UltraGridBand banda0 = grdDatos.DisplayLayout.Bands["DetImp"];
                grdDatos.DisplayLayout.Override.AllowAddNew = AllowAddNew.TemplateOnBottom;
                grdDatos.DisplayLayout.Override.AllowUpdate = Infragistics.Win.DefaultableBoolean.Default;
                banda0.Columns["REFERENCIA"].CellActivation = Activation.ActivateOnly;
                banda0.Columns["BORRAR"].CellActivation = Activation.AllowEdit;
                //banda0.Columns["Borrar"].Hidden = false;
                banda0.Columns["CANTEXPORT"].CellActivation = Activation.ActivateOnly;
                banda0.Columns["SALDO"].CellActivation = Activation.ActivateOnly;
                grdDatos.DisplayLayout.Bands["RelacionFacturas"].Hidden = true;
            }
            else
            {
                MessageBox.Show("Esta importación tiene Facturas de Exportación asociadas. Solo se pueden modificar los datos básicos, no el detalle.", "Activar Controles", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }

            btnEditar.Enabled = false;
            btnSalvar.Enabled = true;
            btnBorrar.Enabled = false;
            ddlFiltroEstado.Enabled = false;
            btnInsertar.Enabled = false;
            btnCancelar.Enabled = true;
            cmdFiltroImpo.Enabled = false;
            mnuPago.Enabled = false;
        }
        private void limpiarControles()
        {
            //Inicializa valores de los controles
            //Para cada control en la forma, asignar el valor de la propiedad
            txtNumeroImpo.Value = 0;
            ddlEstado.Value = "P";
            txtFecha.Value = DateTime.Today;
            txtCalculo.Text = "";
            txtValorImpo.Value = 0;
            txtRemision.Text = "";
            txtObservacion.Text = "";
            txtFechAsig.Value = "";
            txtFechRemi.Value = "";
            txtFechReem.Value = "";
            txtValorRemi.Value = 0;
            txtValorReem.Value = 0;
            //Borrar datos del grid
            if (dsGridDatos.Tables.Count > 1)
            {
                dsGridDatos.Tables[1].Rows.Clear();
                dsGridDatos.Tables[0].Rows.Clear();
            }
            else if (dsGridDatos.Tables.Count > 0)
            {
                dsGridDatos.Tables[0].Rows.Clear();
            }
            grdDatos.DataSource = dsGridDatos;
            //Labels de totales calculados
            txtTotalImport.Value = 0;
            txtTotalExport.Value = 0;
            txtTotalSaldo.Value = 0;
        }
        private void llenarArbolImpo()
        {
            this.Cursor = Cursors.WaitCursor;
            try
            {
                int tAnno = 0;
                int tIndice = -1;
                int tImgIndex;
                string tKey;
                DataTable tImpo = mImpor.leerImportaciones(Valores.gCiaCod, ddlFiltroEstado.ComboBox.SelectedValue.ToString());
                //Mostrarlas en el arbol
                if (tImpo.Rows.Count > 0)
                {
                    lblTotReg.Text = tImpo.Rows.Count + " registros";
                    trvImpo.Nodes.Clear();
                    foreach (DataRow tFila in tImpo.Rows)
                    {
                        if (tAnno != Convert.ToInt16(tFila["Anno"]))
                        {
                            //Insertar nuevo nodo principal de año
                            tAnno = Convert.ToInt16(tFila["Anno"]);
                            tKey = tAnno.ToString();
                            trvImpo.Nodes.Add(new TreeNode(tKey, 0, 0));
                            tIndice += 1;
                        }
                        //Adicionar nodo del numero de importacion
                        tKey = tFila["ImportID"].ToString();
                        switch (Convert.ToChar(tFila["Estado"]))
                        {
                            case 'R':
                                tImgIndex = 5;
                                break;
                            case 'A':
                                tImgIndex = 3;
                                break;
                            case 'P':
                                tImgIndex = 7;
                                break;
                            case 'V':
                                tImgIndex = 9;
                                break;
                            case 'N':
                                tImgIndex = 11;
                                break;
                            default:
                                tImgIndex = 13;
                                break;
                        }
                        trvImpo.Nodes[tIndice].Nodes.Add(tKey, tKey, tImgIndex, tImgIndex + 1);
                    }
                    trvImpo.SelectedNode = trvImpo.Nodes[tIndice].LastNode;
                    tFiltroEstadoActual = ddlFiltroEstado.ComboBox.SelectedValue.ToString();
                }
                else
                {
                    MessageBox.Show("No existen importaciones en el estado indicado. Operación cancelada.", "RDD - Polizas de Importación");
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Ocurrio un error llenando las importaciones: " + ex.Message, "RDD - Importaciones");
            }
            finally
            { this.Cursor = Cursors.Default; }
        }
        private void llenarListasImpo()
        {
            try
            {
                this.Cursor = Cursors.WaitCursor;
                //Agencias
                ddlAgencia.DataSource = Valores.LlenarListaTabla("AGENCIA", "AgenciaID", "AgenciaID", "");
                ddlAgencia.DisplayMember = "AgenciaID";
                ddlAgencia.ValueMember = "AgenciaID";

                List<miComboItem> listaEstado = new List<miComboItem>();
                listaEstado.Add(new miComboItem("P", "Pendiente"));
                listaEstado.Add(new miComboItem("A", "Asignado"));
                listaEstado.Add(new miComboItem("V", "Verificada"));
                listaEstado.Add(new miComboItem("R", "Remitida"));
                listaEstado.Add(new miComboItem("N", "No Remitida"));
                listaEstado.Add(new miComboItem("G", "Pagada"));

                //Llenar lista de Estados
                ddlEstado.DataSource = listaEstado;
                ddlEstado.DisplayMember = "texto";
                ddlEstado.ValueMember = "valor";

                //Llenar lista de filtro por estados, adicionar primero el item Todos
                listaEstado.Insert(0,new miComboItem("T", "Todas"));
                ddlFiltroEstado.ComboBox.DataSource = listaEstado;
                ddlFiltroEstado.ComboBox.ValueMember = "valor";
                ddlFiltroEstado.ComboBox.DisplayMember = "texto";
                ddlFiltroEstado.SelectedIndex = -1;
                ddlFiltroEstado.ComboBox.SelectedValue = "T";
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error al mostrar lista de valores : " + ex.Message, Constantes.RDD, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            finally
            {
                this.Cursor = Cursors.Default;
            }
        }
        private void mostrarRegistroImpo()
        {
            //Para cada control en la forma, asignar el valor de la propiedad
            txtNumeroImpo.Value = mImpor.ImportID;
            ddlEstado.Value = mImpor.Estado;
            txtFecha.Value = mImpor.Fecha;
            txtCalculo.Text = mImpor.Calculo;
            txtValorImpo.Value = mImpor.ValorCol;
            txtRemision.Text = mImpor.RemisionID;
            ddlAgencia.Value = mImpor.AgenciaID;
            txtObservacion.Text = mImpor.Observ;
            txtFechAsig.Value = mImpor.FechAsig;
            txtFechRemi.Value = mImpor.FechRemi;
            txtFechReem.Value = mImpor.FechReem;
            txtValorRemi.Value = mImpor.ValorRemi;
            txtValorReem.Value = mImpor.ValorReem;
            //Leer registro del detalle y asignarlo al datatable asociado al grid
            if (dsGridDatos.Tables.Count > 1)
            {
                dsGridDatos.Tables[1].Rows.Clear();
                dsGridDatos.Tables[0].Rows.Clear();
            }
            else if (dsGridDatos.Tables.Count > 0)
            {
                dsGridDatos.Tables[0].Rows.Clear();
            }
            dsGridDatos = mImpor.leerDetalle();
            grdDatos.DataSource = dsGridDatos;
            //Labels de totales calculados
            txtTotalImport.Value = mImpor.TotImp;
            txtTotalExport.Value = mImpor.TotExp;
            txtTotalSaldo.Value = mImpor.TotSal;
            //Verificar si ya se configuro el grid
            if (!mListoGridI)
            { configurarGridI(); }
            //Verificar si se debe mostrar la banda de facturas
            if (mImpor.TotExp > 0)
            { grdDatos.DisplayLayout.Bands["RelacionFacturas"].Hidden = false; }
            else
            { grdDatos.DisplayLayout.Bands["RelacionFacturas"].Hidden = true; }
            this.Estado = estadoPantalla.Consultar;
        }
        private bool validarDatosGrid(UltraGridRow pFila)
        {
            bool tResultado = true;
            string tMensaje = "";
            string tColumna = "";

            //Validar Referncia
            if (pFila.Cells["Referencia"].Value.ToString() == "")
            {
                tMensaje = "La referencia es un campo obligatorio.";
                tColumna = "Referencia";
            }
            //Cantidad Importada
            else if (pFila.Cells["CANTIMPORT"].Value.ToString() == "")
            {
                tMensaje = "La cantidad importada es un campo obligatorio.";
                tColumna = "CANTIMPORT";
            }
            else if (Convert.ToInt32(pFila.Cells["CANTIMPORT"].Value) <= 0)
            {
                tMensaje = "La cantidad importada debe ser mayor de cero(0)";
                tColumna = "CANTIMPORT";
            }
            //Ocurrió un error. Mostrar el mensaje personalizado y activar celda con el error.
            if (tMensaje != "")
            {
                MessageBox.Show("Datos no válidos : " + tMensaje, "Actualizar Datos", MessageBoxButtons.OK, MessageBoxIcon.Error);
                grdDatos.ActiveRow.Cells[tColumna].Activate();
                grdDatos.PerformAction(UltraGridAction.EnterEditMode);
                tResultado = false;
            }
            return tResultado;
        }
        private bool validarDatos()
        {
            //Validar datos del registro encabezado
            string tMensaje = "";
            object tControl = new object();
            //Numero de importacion
            if (txtNumeroImpo.Value.ToString().Length == 0)
            {
                tMensaje = "El número de importacion es obligatorio. Favor ingresar número válido";
                txtNumeroImpo.Focus();
            }
            else if (Convert.ToInt32(txtNumeroImpo.Value) == 0)
            {
                tMensaje = "El número de importacion debe ser mayor a Cero. Favor ingresar número válido";
                txtNumeroImpo.Focus();
            }
            else if (Convert.ToDateTime(txtFecha.Value).Date > DateTime.Today)
            {
                tMensaje = "La fecha de la importación no puede ser mayor a la fecha actual. Favor corregir y volver a intentar.";
                txtFecha.Focus();
            }
            else if (txtCalculo.Text.Length == 0)
            {
                tMensaje = "El cálculo es un campo obligatorio. Favor digitar cálculo correcto.";
                txtCalculo.Focus();
            }
            if (tMensaje.Length > 0)
            {
                MessageBox.Show("Error : " + tMensaje, "Registro Importación", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }
            else
            {
                return true;
            }
        }
        #endregion Metodos Privados

        #region Eventos del Grid
        private void grdDatosI_AfterRowUpdate(object sender, RowEventArgs e)
        {
            //Desactivar la columna con la llave, despues de salvar la fila
            e.Row.Cells["REFERENCIA"].Activation = Activation.ActivateOnly;
        }
        private void grdDatosI_AfterRowInsert(object sender, RowEventArgs e)
        {
            //Asignar valores llave foranea
            e.Row.Cells["CiaCod"].Value = Valores.gCiaCod;
            e.Row.Cells["ImportID"].Value = txtNumeroImpo.Value;
            //Activar celda con llave primaria
            e.Row.Cells["REFERENCIA"].IgnoreRowColActivation = true;
            e.Row.Cells["REFERENCIA"].Activation = Activation.AllowEdit;
            e.Row.Cells["REFERENCIA"].Activate();
            //No permitir modificar la columna de borrar
            e.Row.Cells["BORRAR"].Activation = Activation.Disabled;
            grdDatos.PerformAction(UltraGridAction.EnterEditMode);
            e.Row.Cells["INS"].Value = true;
            e.Row.Cells["ACT"].Value = false;
        }
        private void grdDatosI_BeforeRowUpdate(object sender, CancelableRowEventArgs e)
        {
            try
            {
                mFila = grdDatos.Rows[e.Row.Index];
                if (!validarDatosGrid(mFila))
                {
                    e.Cancel = true;
                    datosValidos = false;
                }
                else
                {
                    if (mFila.Cells["CANTEXPORT"].Value.ToString() == "" || Convert.ToDouble(mFila.Cells["CANTEXPORT"].Value) == 0)
                    {
                        //Una fila sin exportacioens se inicializan los valores 
                        mFila.Cells["CANTEXPORT"].Value = 0;
                        mFila.Cells["Saldo"].Value = mFila.Cells["CANTIMPORT"].Value;
                    }

                    if (!Convert.ToBoolean(mFila.Cells["INS"].Value))
                    {
                        //Se salvo una fila que ya exsitia, se marca como modificada
                        mFila.Cells["ACT"].Value = true;
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Ocurrion un error al salvar los datos de la fila : " + ex.Message,
                    "Actualizar Datos", MessageBoxButtons.OK, MessageBoxIcon.Error);
                e.Cancel = true;
                datosValidos = false;
            }
        }
        private void grdDatosI_BeforeCellActivate(object sender, CancelableCellEventArgs e)
        {
            if (e.Cell.Band.Key == "DETIMP" && Convert.ToBoolean(e.Cell.Row.Cells["BORRAR"].Value))
            {
                e.Cancel = true;
            }
        }
        private void grdDatos_DoubleClickRow(object sender, DoubleClickRowEventArgs e)
        {
            if (Estado == estadoPantalla.Consultar)
            {
                if (e.Row.Band.Key == "RelacionFacturas")
                {
                    //Mostrar Factura seleccionada
                    MDIPrincipal tForma = ((MDIPrincipal)this.ParentForm);
                    //Verificar si ya está visible la forma
                    if (tForma.fFactExpo == null || tForma.fFactExpo.IsDisposed)
                    {
                        //Cargar en memoria la forma
                        tForma.fFactExpo = new FactExpo();
                        tForma.fFactExpo.MdiParent = tForma;
                        tForma.fFactExpo.Show();
                    }
                    //Buscar Factura en el arbol
                    tForma.fFactExpo.txtBuscar.Text = e.Row.Cells["FacturaID"].Value.ToString();
                    tForma.fFactExpo.buscarNodo();
                    tForma.fFactExpo.WindowState = FormWindowState.Normal;
                    tForma.fFactExpo.Focus();
                }
            }
        }
        private void grdDatosI_Error(object sender, ErrorEventArgs e)
        {
            string tMensaje = "Ocurrio un Error en los datos del Grid. " + e.ErrorText;
            if (e.ErrorType == ErrorType.Data)
            {
                //Error de datos al salvar la fila de datos
                if (e.DataErrorInfo.Source == DataErrorSource.RowUpdate)
                {
                    if (e.ErrorText.Contains("MaestraDetalle"))
                    {
                        tMensaje = "No existe un documento de importacion para este detalle.";
                    }
                    else if (e.ErrorText.Contains("REFERENCIA"))
                    {
                        tMensaje = "Referencia no puede repetirse. Ya existe una fila con el valor seleccionado.";
                    }
                }
                else if (e.DataErrorInfo.Source == DataErrorSource.CellUpdate)
                {
                    if (e.DataErrorInfo.Cell.Column.Key == "REFERENCIA")
                        tMensaje = "Referencia invalida. Debe seleccionar una Referencia de la lista.";
                }

                //Cancelar el error para que podamos desplegar un mensaje personalizado
                e.Cancel = true;
                MessageBox.Show(this, tMensaje, "Error en el Grid", MessageBoxButtons.OK, MessageBoxIcon.Error);
                grdDatos.ActiveRow.Cells["REFERENCIA"].Activate();
                grdDatos.PerformAction(UltraGridAction.EnterEditMode);
                datosValidos = false;
            }
        }
        private void grdDatos_KeyUp(object sender, KeyEventArgs e)
        {
            //Hacer que el Enter funcione como el TAB
            if (e.KeyCode == Keys.Enter)
            {
                grdDatos.PerformAction(UltraGridAction.ExitEditMode, false, false);
                grdDatos.PerformAction(UltraGridAction.NextCellByTab, false, false);
                e.Handled = true;
                grdDatos.PerformAction(UltraGridAction.EnterEditMode, false, false);
            }
        }
        private void grdDatosI_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Right)
            {
                Point mousePoint = new Point(e.X, e.Y);
                UIElement element = ((UltraGrid)sender).DisplayLayout.UIElement.ElementFromPoint(mousePoint);
                UltraGridCell cell = element.GetContext(typeof(UltraGridCell)) as UltraGridCell;
                if (cell != null && Estado != estadoPantalla.Consultar && txtTotalExport.Value.ToString() == "0" )
                {
                    mFila = cell.Row;
                    //this.mnuGrid.Show(mousePoint.X + grdDatos.Left,mousePoint.Y + grdDatos.Top);
                    this.mnuGrid.Show(mousePoint.X + panel2.Location.X + pnlDerecho.Left + this.Location.X, mousePoint.Y + panel2.Location.Y + groupBox1.Height - pnlDerecho.Location.Y + this.Location.Y);
                }
            }
        }
        #endregion Eventos del Grid

    }
}
